package com.irdstudio.efp.riskm.api.rest;

import com.irdstudio.basic.framework.core.constant.ApplicationConstance;
import com.irdstudio.basic.framework.core.constant.ResponseData;
import com.irdstudio.basic.framework.core.util.TimeUtil;
import com.irdstudio.basic.framework.web.controller.AbstractController;
import com.irdstudio.basic.sequence.service.facade.SequenceService;
import com.irdstudio.efp.console.common.ConsoleConstant;
import com.irdstudio.efp.e4a.service.facade.SRoleDataRuleService;
import com.irdstudio.efp.riskm.api.service.RiskmUtilService;
import com.irdstudio.efp.riskm.common.RiskColltConstant;
import com.irdstudio.efp.riskm.service.facade.ColltSmsNoticeAppService;
import com.irdstudio.efp.riskm.service.facade.ColltTaskFlowAppService;
import com.irdstudio.efp.riskm.service.facade.ColltTaskInfoService;
import com.irdstudio.efp.riskm.service.vo.ColltTaskFlowAppVO;
import com.irdstudio.efp.riskm.service.vo.ColltTaskInfoVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.web.bind.annotation.*;

import java.util.List;


/**
 * Controller：催收任务流转申请表
 *
 * @author ligm
 * @date 2019-08-27
 */
@RestController
@RequestMapping("/api")
public class ColltTaskFlowAppController extends AbstractController {

    @Autowired
    @Qualifier("colltTaskFlowAppService")
    private ColltTaskFlowAppService colltTaskFlowAppService;

    @Autowired
    @Qualifier("sRoleDataRuleService")
    private SRoleDataRuleService sRoleDataRuleService;

    @Autowired
    @Qualifier("dbSeqService")
    private SequenceService sequenceService;

    @Autowired
    @Qualifier("colltSmsNoticeAppService")
    private ColltSmsNoticeAppService colltSmsNoticeAppService;

    @Autowired
    @Qualifier("colltTaskInfoService")
    private ColltTaskInfoService colltTaskInfoService;

    @Autowired
    private RiskmUtilService riskmUtilService;

    /**
     * create by luzy
     * 新增数据
     * @param inColltTaskFlowAppVo
     * @return
     */
    @PostMapping(value = "/collt/task/flow/app")
    public @ResponseBody
    ResponseData<Integer> insertColltTaskFlowApp(@RequestBody ColltTaskFlowAppVO inColltTaskFlowAppVo) {
        ColltTaskFlowAppVO colltTaskFlowAppVo = new ColltTaskFlowAppVO();
        try {
            colltTaskFlowAppVo.setFlowApplyNo(sequenceService.getSequence("CTFA_NO", null, null));
            colltTaskFlowAppVo.setColltTaskNo(inColltTaskFlowAppVo.getColltTaskNo());
            colltTaskFlowAppVo.setFlowReson(inColltTaskFlowAppVo.getFlowReson());
            colltTaskFlowAppVo.setFlowColltTaskType(inColltTaskFlowAppVo.getFlowColltTaskType());
            //APRV_STATUS_03 = 通过
            colltTaskFlowAppVo.setApproveStatus(ConsoleConstant.APRV_STATUS_03);
            colltTaskFlowAppVo.setAprvUserCode(inColltTaskFlowAppVo.getAprvUserCode());
            colltTaskFlowAppVo.setAprvUserName(inColltTaskFlowAppVo.getAprvUserName());
            colltTaskFlowAppVo.setAprvComment("催收管理员在催收任务池，操作催收任务流转，不需走审批流程，默认审批通过。");
            colltTaskFlowAppVo.setAprvTime(TimeUtil.getCurrentDateTime());
            colltTaskFlowAppVo.setCreateUser(inColltTaskFlowAppVo.getCreateUser());
            colltTaskFlowAppVo.setCreateTime(TimeUtil.getCurrentDateTime());
            colltTaskFlowAppVo.setCreateUserOrg(inColltTaskFlowAppVo.getCreateUserOrg());
        } catch (Exception e) {
            e.printStackTrace();
        }
        int outputVo = colltTaskFlowAppService.insertColltTaskFlowApp(colltTaskFlowAppVo);
        //插入操作成功，更新colltTaskInfo信息 中
        if (outputVo > -1) {
            int i = updataColltTaskInfo(colltTaskFlowAppVo);
            return getResponseData(i);
        }
        return getResponseData(outputVo);
    }

    public int updataColltTaskInfo(ColltTaskFlowAppVO colltTaskFlowAppVo) {
        ColltTaskInfoVO colltTaskInfoVO = new ColltTaskInfoVO();
        colltTaskInfoVO.setColltTaskNo(colltTaskFlowAppVo.getColltTaskNo());
        colltTaskInfoVO.setColltWay(colltTaskFlowAppVo.getFlowColltTaskType());
        colltTaskInfoVO.setIdentWay(RiskColltConstant.IDENT_WAY_02);
        colltTaskInfoVO.setLastUpdateUser(colltTaskFlowAppVo.getCreateUser());
        //案件流转到委外催收时，需赋值经手类型，统一为"一手"
        if(RiskColltConstant.STD_COLLT_WAY_03.equals(colltTaskFlowAppVo.getFlowColltTaskType())){
            colltTaskInfoVO.setOutsHdleType(RiskColltConstant.STD_HANDLE_TYPE_01);
        }
        int outputVo = colltTaskInfoService.updateByPk(colltTaskInfoVO);
        return outputVo;
    }

    /**
     * 根据主键删除信息
     *
     * @param inColltTaskFlowAppVo
     * @return
     */
    @DeleteMapping(value = "/collt/task/flow/app")
    public @ResponseBody
    ResponseData<Integer> deleteByPk(@RequestBody ColltTaskFlowAppVO inColltTaskFlowAppVo) {
        int outputVo = colltTaskFlowAppService.deleteByPk(inColltTaskFlowAppVo);
        return getResponseData(outputVo);
    }

    /**
     * 根据主键更新信息
     *
     * @param inColltTaskFlowAppVo
     * @return
     */
    @PutMapping(value = "/collt/task/flow/app")
    public @ResponseBody
    ResponseData<Integer> updateByPk(@RequestBody ColltTaskFlowAppVO inColltTaskFlowAppVo) {

        int outputVo = colltTaskFlowAppService.updateByPk(inColltTaskFlowAppVo);
        return getResponseData(outputVo);
    }

    /**
     * 根据主键查询详情
     *
     * @param
     * @return
     */
    @GetMapping(value = "/collt/task/flow/app")
    public @ResponseBody ResponseData<ColltTaskFlowAppVO> queryByPk() {
        ColltTaskFlowAppVO inVo = new ColltTaskFlowAppVO();
        ColltTaskFlowAppVO outputVo = colltTaskFlowAppService.queryByPk(inVo);
        return getResponseData(outputVo);
    }

    /**
     * 列表数据查询
     *
     * @param vo
     * @return
     */
    @RequestMapping(value = "/collt/task/flow/apps", method = RequestMethod.POST)
    public @ResponseBody
    ResponseData<List<ColltTaskFlowAppVO>> queryColltTaskFlowAppAll(@RequestBody ColltTaskFlowAppVO vo) {
        List<ColltTaskFlowAppVO> outputVo = null;
        setUserInfoToVO(vo);
        outputVo = colltTaskFlowAppService.queryAllByLevelOne(vo);
        riskmUtilService.displayUserName(outputVo,"createUser","createUserName");
        riskmUtilService.displayOrgName(outputVo,"createUserOrg","createUserOrgName");
        return getResponseData(outputVo);
    }

    /**
     * 根据任务编号查询是否存在审批中的任务<br>
     * <p>
     * 0.1:wanglihua:2019/9/2 16:13: TODO: <br>
     *
     * @return
     * @author wanglihua
     * @params * @param null
     * @date 2019/9/2 16:13
     * @version 0.1
     * @since 2019/9/2 16:13
     */
    @RequestMapping(value = "/collt/task/flow/info/{colltTaskNo}", method = RequestMethod.GET)
    public @ResponseBody
    ResponseData<Integer> queryByColltTaskNo(@PathVariable("colltTaskNo") String colltTaskNo) {
        ColltTaskFlowAppVO colltTaskFlowAppVO = new ColltTaskFlowAppVO();
        colltTaskFlowAppVO.setColltTaskNo(colltTaskNo);
        List<ColltTaskFlowAppVO> queryRs = colltTaskFlowAppService.queryByColltTaskNo(colltTaskFlowAppVO);
        int outputVo = 0;
        for (ColltTaskFlowAppVO item : queryRs) {
            if (ConsoleConstant.APRV_STATUS_02.equals(item.getApproveStatus())) {
                outputVo += 1;
            }
        }
        return getResponseData(outputVo);
    }


    /**
     * TODO: 流转信息查询
     *
     * @return
     * @author luzhaoyu
     * @params * @param null
     * @date 2019/9/4 10:21
     */
    @RequestMapping(value = "/collt/task/flow/app/info/{colltTaskNo}", method = RequestMethod.GET)
    public @ResponseBody
    ResponseData<ColltTaskFlowAppVO> queryColltTaskFlowAppInfo(@PathVariable("colltTaskNo") String colltTaskNo) {
        ColltTaskFlowAppVO colltTaskFlowAppVO = new ColltTaskFlowAppVO();
        colltTaskFlowAppVO.setColltTaskNo(colltTaskNo);
        ColltTaskFlowAppVO outputVo = colltTaskFlowAppService.queryColltTaskFlowAppInfo(colltTaskFlowAppVO);
        return getResponseData(outputVo);
    }

    /**
     * TODO: <br>
     * <p>
     * 存入人工流转信息
     *
     * @return
     * @author wanglihua
     * @params * @param null
     * @date 2019/9/20 9:20
     * @version 0.1
     * @since 2019/9/20 9:20
     */
    @PostMapping(value = "/collt/litiTask/save")
    public @ResponseBody
    ResponseData<Integer> insertLitiColltTaskFlowInfo(@RequestBody ColltTaskFlowAppVO inColltTaskFlowAppVo) {
        setUserInfoToVO(inColltTaskFlowAppVo);
        int outputVo = 0;
        try {
            inColltTaskFlowAppVo.setFlowApplyNo(sequenceService.getSequence("CTFA_NO", null, null));
            inColltTaskFlowAppVo.setBasicColltTaskType(RiskColltConstant.STD_COLLT_WAY_04);
            inColltTaskFlowAppVo.setAprvTime(TimeUtil.getCurrentDateTime());
            //审批状态置为“待发起”，为人工流转做准备
            inColltTaskFlowAppVo.setApproveStatus(ConsoleConstant.APRV_STATUS_01);
            inColltTaskFlowAppVo.setCreateUser(inColltTaskFlowAppVo.getLoginUserId());
            inColltTaskFlowAppVo.setCreateTime(TimeUtil.getCurrentDateTime());
            inColltTaskFlowAppVo.setCreateUserOrg(inColltTaskFlowAppVo.getLoginUserOrgCode());
        } catch (Exception e) {
            e.printStackTrace();
        }
        outputVo = colltTaskFlowAppService.insertColltTaskFlowApp(inColltTaskFlowAppVo);

        return setSuccessResponseMessage(outputVo, inColltTaskFlowAppVo.getFlowApplyNo());
    }

    /**
     *
     * @author xiezw
     * @params  * @param null
     * @return
     * @date 2019/12/26 15:11
     * @version 0.1
     */
    @PostMapping(value = "/collt/task/flow/rcd")
    public @ResponseBody
    ResponseData<List<ColltTaskFlowAppVO>> queryTaskFlowRcd(@RequestBody ColltTaskFlowAppVO inColltTaskFlowAppVo) {
        List<ColltTaskFlowAppVO> outputVo = colltTaskFlowAppService.queryAllByColltTaskNo(inColltTaskFlowAppVo);
        riskmUtilService.displayUserName(outputVo,"createUser","createUserName");
        return getResponseData(outputVo);
    }

    /**
     * TODO: <br>
     * <p>
     * 0.1:wanglihua:2019/9/20 9:21: TODO: <br>
     *
     * @return
     * @author wanglihua
     * @params * @param null
     * @date 2019/9/20 9:21
     * @version 0.1
     * @since 2019/9/20 9:21
     */
    private ResponseData<Integer> setSuccessResponseMessage(int outputVo, String message) {
        ResponseData<Integer> responseData = new ResponseData<Integer>();
        responseData.setMessage(message);
        responseData.setCode(ApplicationConstance.SUCCESS);
        responseData.setSuccess(true);
        return responseData;
    }
}
